package c16多线程;

/**
 * 子线程循环10次，接着主线程循环100，接着又回到子线程循环10次，接着再回到主线程又循环100。
 * 如此循环50次，请写出程序。
 *
 * @author 炜sama
 */
public class TestMainAndSub {

	private static int count = 50;//总循环次数
	private static int m = 100;//主线程循环次数
	public static int s = 10;//子线程循环次数

	public static void main(String[] args) {
		Thread ts = new Thread(new SubThread());
		ts.start();
		//主线程等待500毫秒以确定让子线程先运行
		try {
			Thread.sleep(500);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		//主线程同步代码块
		synchronized (TestMainAndSub.class) {
			for (int j = 0; j < m * count; j++) {
				System.err.println("m-" + j);
				//如果本次循环主线程已经循环够m次，就唤醒子线程，自己则进入等待
				if ((j + 1) % m == 0) {
					try {
						TestMainAndSub.class.notify();
						TestMainAndSub.class.wait();
					} catch (Exception e) {
					}
				}
			}
		}
	}

	static class SubThread implements Runnable {

		@Override
		public void run() {
			synchronized (TestMainAndSub.class) {
				for (int j = 0; j < s * count; j++) {
					System.err.println("s-" + j);
					//如果本次循环子线程已经循环够s次，就唤醒主线程，自己则进入等待
					if ((j + 1) % s == 0) {
						try {
							TestMainAndSub.class.notify();
							TestMainAndSub.class.wait();
						} catch (InterruptedException e) {
							e.printStackTrace();
						}
					}
				}
			}
		}
	}
}
